/**
 * 枚举的作用：增加程序的可读性，枚举类型最常见也最有意义的用处之一就是用来描述状态量。
 */
class Enum {
	// 将每个键添加到枚举对象并冻结新创建的实例
	constructor(...keys) {
		// 提供对枚举值作为字符串的访问
		keys.forEach((key, i) => {
			this[key] = i;
		});
		// 冻结对象
		Object.freeze(this);
	}
	// 1. 永远不会与枚举中的任何值发生冲突
	// 2. 允许将枚举视为可迭代并使其更有用
	*[Symbol.iterator]() {
		for (let key of Object.keys(this)) yield key;
	}
}

const daysEnum = new Enum(
	'monday',
	'tuesday',
	'wednesday',
	'thursday',
	'friday',
	'saturday',
	'sunday'
);

const days = [...daysEnum]; // [ 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday' ]
